/*
 * Created on Mar 20, 2006
 *
 */
package ar.edu.utn.frba.gdaia.src.action;

import java.util.Date;
import java.util.Iterator;
import java.util.Map;

import ar.edu.utn.frba.gdaia.src.domain.Canal;
import ar.edu.utn.frba.gdaia.src.domain.Concepto;
import ar.edu.utn.frba.gdaia.src.domain.Regla;
import ar.edu.utn.frba.gdaia.src.main.Cerebro;

/**
 * @author Patricio y Fernando Se encarga de generar la regla aprendida si la
 *         regla no se encuentra almacenada.
 */
public class LearnRuleCommand extends Command {

	public void execute(Map parameters) {

		Cerebro cerebro = (Cerebro) parameters.get(Command.CEREBRO);
		// analizamos las situaciones, para ver si amerita crear la regla.

		// Analizamos si esta entrada es una correcion de la respuesta anterior,
		// si amerita.
		if (cerebro.getSituacionActual() != null && cerebro.isCorrecion()) {
			cerebro.setSituacionPrevia(cerebro.getMomentoAnterior().getSituacionPrevia());
		}

		// si esta situacion no se cumple no tiene sentido aprender nada.
		if (cerebro.getSituacionActual() != null && cerebro.getSituacionPrevia() != null) {
			// aprender la regla
			// TODO NO sabemos que USO tiene, y que va en Situacion Intermedia
			Regla nuevaRegla = new Regla(cerebro.getNextRuleNumber(), cerebro.getUsoSecuencial(), new Date(), cerebro.getSituacionPrevia(), null, cerebro.getSituacionActual(),Canal.INT_LERN_RULE);
			// agrego la regla al cerebro
			cerebro.getReglasExternas().add(nuevaRegla);

			// agrego la ultima regla aprendida a la memoria cronologica
			cerebro.addLastToCronMemory(nuevaRegla);

			this.incrementarPopularidadDeConceptos(nuevaRegla);
			// VACIO las situaciones.
			cerebro.setSituacionActual(null);
			cerebro.setSituacionPrevia(null);
		}
	}

	/**
	 * @param reglaEncontrada
	 */
	private void incrementarPopularidadDeConceptos(Regla regla) {
		for (Iterator it = regla.getSituacionInicial().getEstado().iterator(); it.hasNext();) {
			Concepto concepto = (Concepto) it.next();
			// incremento por formar parte de esta regla
			concepto.incrementarPopularidad();
		}
		for (Iterator it = regla.getSituacionFinal().getEstado().iterator(); it.hasNext();) {
			Concepto concepto = (Concepto) it.next();
			// incremento por formar parte de esta regla si es que no lo
			// incremente en el ciclo anterior
			if (!regla.getSituacionInicial().getEstado().contains(concepto)) concepto.incrementarPopularidad();
		}
	}
}
